/**
 *
 * @author marc.molins.piulachs
 *
 */


package words2;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Set;



public class Main {


	private static String path;
	private static String sep = System.getProperty("file.separator");
	private static char[] lletres;
	private static ArrayList<String> resultats;






	


	private static void comprova(String s) {

		String linia = "";


		FileControllerD fc = new FileControllerD();
        BufferedReader input = fc.getFileR("."+sep+ "spanish2.txt");


		try {
			linia = input.readLine();

		}
		catch (IOException ex) {
			Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
		}

		if(linia.equals(s)) {
			//System.out.println(s);
			resultats.add(s);
			linia = null;
		}

		while(linia != null) {

			try {
				linia = input.readLine();
			} catch (IOException ex) {
				Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
			}

			if(linia != null) {
				if (linia.equals(s)) {
					//System.out.println(s);
					resultats.add(s);
					linia = null;
				}
				//System.out.println("AA "+ linia.charAt(0) + " "+ s.charAt(0));

				else if(linia.charAt(0) > s.charAt(0)) linia = null;

			}
		}

	}



	private static void readLettersFromConsole() {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String s = "";
		int i;
		char c;

		i = 0;

		while (i < 7 && !s.equals(".")) {

			try {
				s = br.readLine();

				while (s.isEmpty() || s.length() > 1 || ((s.charAt(0) < 'a' || s.charAt(0) > 'z') && !s.equals("."))) {
					if (!s.isEmpty()) System.out.println("Error, repeteix la lletra");
					s = br.readLine();
				}
			}
			catch (IOException ex) {

				Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
			}


			if (i == 0 && s.equals(".")) {
				s = "";
				i = -1;
				System.out.println("Introdueix una lletra com a minim");
			}
			else {
				c = s.charAt(0);
				lletres[i] = c;
			}

			++i;
		}


		System.out.print("Lletres llegides: ");
	}





    public static void permuta7(String a, LinkedList<Character> conjunt) {
        if (conjunt.size()==1)
        {
            //System.out.println("permut "+a+conjunt.get(0));
			comprova(a+conjunt.get(0));
			comprova(a);
        }
		else if (conjunt.size()== 2) {
			comprova(a);
		}
		else if (conjunt.size()== 3) {
			comprova(a);
		}
		else if (conjunt.size()== 4) {
			comprova(a);
		}
		else if (conjunt.size()== 5) {
			comprova(a);
		}
		else if (conjunt.size()== 6) {
			comprova(a);
		}
        for (int i=0;i<conjunt.size();i++)
        {
            Character b = conjunt.remove(i);
            permuta7(a+b, conjunt);
            conjunt.add(i,b);
        }
    }

	    public static void permuta6(String a, LinkedList<Character> conjunt) {
        if (conjunt.size()==1)
        {
            //System.out.println("permut "+a+conjunt.get(0));
			comprova(a+conjunt.get(0));
			comprova(a);
        }
		else if (conjunt.size()== 2) {
			comprova(a);
		}
		else if (conjunt.size()== 3) {
			comprova(a);
		}
		else if (conjunt.size()== 4) {
			comprova(a);
		}
		else if (conjunt.size()== 5) {
			comprova(a);
		}
        for (int i=0;i<conjunt.size();i++)
        {
            Character b = conjunt.remove(i);
            permuta7(a+b, conjunt);
            conjunt.add(i,b);
        }
    }

	public static void permuta5(String a, LinkedList<Character> conjunt) {
        if (conjunt.size()==1)
        {
            //System.out.println("permut "+a+conjunt.get(0));
			comprova(a+conjunt.get(0));
			comprova(a);
        }
		else if (conjunt.size()== 2) {
			comprova(a);
		}
		else if (conjunt.size()== 3) {
			comprova(a);
		}
		else if (conjunt.size()== 4) {
			comprova(a);
		}

        for (int i=0;i<conjunt.size();i++)
        {
            Character b = conjunt.remove(i);
            permuta7(a+b, conjunt);
            conjunt.add(i,b);
        }
    }

    public static void permuta4(String a, LinkedList<Character> conjunt) {
        if (conjunt.size()==1)
        {
            //System.out.println("permut "+a+conjunt.get(0));
			comprova(a+conjunt.get(0));
			comprova(a);
        }
		else if (conjunt.size()== 2) {
			comprova(a);
		}
		else if (conjunt.size()== 3) {
			comprova(a);
		}

        for (int i=0;i<conjunt.size();i++)
        {
            Character b = conjunt.remove(i);
            permuta7(a+b, conjunt);
            conjunt.add(i,b);
        }
    }
    public static void permuta3(String a, LinkedList<Character> conjunt) {
        if (conjunt.size()==1)
        {
            //System.out.println("permut "+a+conjunt.get(0));
			comprova(a+conjunt.get(0));
			comprova(a);
        }
		else if (conjunt.size()== 2) {
			comprova(a);
		}

        for (int i=0;i<conjunt.size();i++)
        {
            Character b = conjunt.remove(i);
            permuta7(a+b, conjunt);
            conjunt.add(i,b);
        }
    }

    public static void permuta2(String a, LinkedList<Character> conjunt) {
        if (conjunt.size()==1)
        {
            //System.out.println("permut "+a+conjunt.get(0));
			comprova(a+conjunt.get(0));
			comprova(a);
        }
        for (int i=0;i<conjunt.size();i++)
        {
            Character b = conjunt.remove(i);
            permuta7(a+b, conjunt);
            conjunt.add(i,b);
        }
    }


  public static void removeDuplicates(ArrayList list)
  {
    Set set = new HashSet();
    ArrayList newList = new ArrayList<String>();
    for (Iterator iter = list.iterator(); iter.hasNext(); ) {
      Object element = iter.next();
      if (set.add(element))
        newList.add(element);
    }
    list.clear();
    list.addAll(newList);
  }


	public static void main(String[] args) {

		String jarPath = System.getProperty("java.class.path");
		
		int lastSlash = jarPath.lastIndexOf(sep);
		path = jarPath.substring(0,lastSlash + 1);


		lletres = new char[7];
		resultats = new ArrayList<String>();

		System.out.println("Introdueix 7 lletres o menys, una a cada linia\n"
				+ "(en el cas que siguin menys indica el final amb un punt en una nova linia):");

		readLettersFromConsole();

		for (int i = 0; i < 7; ++i)
		System.out.print(lletres[i]+" ");

		System.out.println("\nEspera uns segons...");



        LinkedList<Character> conjunt =new LinkedList<Character>();
		for (int i = 0; i < 7; ++i) {
			if (lletres[i] != '.') conjunt.add(lletres[i]);
			else break;
		}
		int s = conjunt.size();
		
		if (s == 7) permuta7("", conjunt);
		else if (s == 6) permuta6("", conjunt);
		else if (s == 5) permuta5("", conjunt);
		else if (s == 4) permuta4("", conjunt);
		else if (s == 3) permuta3("", conjunt);
		else if (s == 2) permuta2("", conjunt);
		else if (s == 1) comprova(lletres[0]+"");


		removeDuplicates(resultats);

        Collections.sort(resultats, new Comparator<String>(){

            public int compare(String o1, String o2) {
				String p1 = o1;
				String p2 = o2;
				return (p1.length() > p2.length() ? -1 :
                (p1.length() == p2.length() ? 0 : 1));
  
            }

        });

		System.out.println("----RESULTATS----");
		if (resultats.isEmpty()) System.out.println("No s'han trobat combinacions");
		for (int i = 0; i < resultats.size(); ++i)
			System.out.println(resultats.get(i));
    }



}
